home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
104_01
/
c7.c
< prev
next >
Wrap
Text File
|
1980-01-01
|
14KB
|
589 lines
#ifndef TRUE /* see if include needed */
#include <C.DEF>
#endif
heir11(lval,status)
int *lval;
int *status;
{
int k;
char *ptr;
int lval2[lvalsize];
k=primary(lval,status);
ptr=lval[0];
blanks();
switch(ch()) {
/* subscript varble */
case '[' :
gch(); /* eat '[' */
switch(ptr[ident]) {
/* array of elements */
case array :
*status=FALSE;
++lval[1];
if (const_exp(lval2) && ch()==']') {
lval[2]=data_size(lval)*
lval2[0];
needbrack("]");
return NOTLOADED;
}
else {
expression();
size_adjust(lval);
swap();
address(lval,NOTLOADED);
add_address();
needbrack("]");
return ADDRESS;
}
/* pointer to elements */
case pointer:
*status=FALSE;
if (const_exp(lval2) && ch()==']') {
immed();
outdec(data_size(lval)*
lval2[0]);
nl();
swap();
rvalue(lval,2);
add_address();
}
else {
expression();
size_adjust(lval);
swap();
rvalue(lval,2);
add_address();
}
needbrack("]");
lval[1] += 1;
return ADDRESS;
/* not a vaild ident for subscript */
default :
suberror(ptr);
return LOADED;
}
/* a function call */
case '(' :
*status=FALSE;
gch(); /* eat '(' */
callfunction(lval[0]);
return LOADED;
/* not a subscripted or function call (not for this level */
default:
return k;
}
}
primary(lval,status)
int *lval;
int *status;
{
char *ptr;
char sname[namesize];
int num[1];
int k;
/* clear lval array for use */
lval[0]=
lval[1]=
lval[2]=0;
if(match("(")) {
k=heir1(lval,status);
needbrack(")");
return k;
}
*status=FALSE;
if (symname(sname)) {
if ((lval[0]=findloc(sname))) return 2;
if ((lval[0]=ptr=findglb(sname)))
if (ptr[ident] != function) return 2;
if (ch() =='(') {
if (!(ptr=findglb(sname)))
if (glbptr>=endglb) {
error("global symbol table ofverflow");
}
else {
ptr=glbptr;
glbptr+=symsiz;
strcpy(ptr+name,sname);
ptr[ident]=function;
ptr[type]=cint;
ptr[offset]=
ptr[offset1]=
ptr[storage]=
ptr[indcnt]=0;
}
lval[0]=ptr;
return 2;
}
else {
undefine(sname);
return 0;
}
}
if (constant(num)) {
return 0;
}
else {
error("invalid expression");
junk();
return 0;
}
}
/* */
/* written 4/23/81 by Mike Bernson */
/* */
size_adjust(lval)
int *lval;
{
int size;
size=data_size(lval);
if (size == 1) return;
if (size == 2) {
doublereg();
}
}
/* */
/* written 4/23/81 By Mike Bernson */
/* */
data_size(lval)
int *lval;
{
char *ptr;
if (!(ptr=lval[0])) return 0;
switch(ptr[ident]) {
/* array of elements */
case array :
switch(ptr[type]) {
/* char type */
case cchar:
return lchar;
/* int type */
case cint :
return lint;
}
/* pointer to elements */
case pointer :
if (lval[1] < ptr[indcnt] && ptr[indcnt] > 1)
return lpoint;
else switch(ptr[type]) {
/* type char */
case cchar :
return lchar;
/* type int */
case cint:
return lint;
}
/* just a plain variable */
case variable :
return 1;
}
}
/* */
/* written 4/23/81 By Mike Bernson */
/* */
address(lval,k)
int *lval;
{
char *ptr;
if (!(ptr=lval[0]) || k != NOTLOADED) return;
switch(ptr[storage]) {
/* global symbol */
case statik :
immed();
outstr(ptr+name);
if (lval[2]) {
outstr("+");
outdec(lval[2]);
}
nl();
break;
/* local symbol */
case stkloc :
case stkarg :
immed();
outdec((ptr[offset]+ptr[offset1]*256+lval[2])-sp);
nl();
ot("dad\tsp");
nl();
break;
}
}
/* */
/* date written 6/6/81 by Mike Bernson */
/* */
/* check to see if static load or store */
/* */
loadstatic(lval,k)
int *lval;
int k;
{
char *ptr;
ptr=lval[0];
if (ptr[storage] == statik && k == NOTLOADED) return TRUE;
else return FALSE;
}
/* */
/* date written 4/30/81 By Mike Bernson */
/* */
store(lval,k)
int *lval;
int k;
{
char *ptr;
ptr=lval[0];
if (k==0) return;
switch(ptr[storage]) {
/* local or arg type */
case stkloc :
case stkarg :
switch(ptr[ident]) {
/* ident =array */
case array:
if (lval[1] == ptr[indcnt])
if (k==ADDRESS) putstk(ptr[type]);
else putmem_stack(lval,ptr[type]);
break;
/* ident is an pointer */
case pointer:
if (lval[1] == ptr[indcnt])
if (k==ADDRESS) putstk(ptr[type]);
else putmem_stack(lval,ptr[type]);
else if (k==ADDRESS) putstk(cint);
else putmem_stack(lval,cint);
break;
/* ident is a variable */
case variable :
if (k==ADDRESS) putstk(ptr[type]);
else putmem_stack(lval,ptr[type]);
break;
}
break;
/* static varbles */
case statik :
switch(ptr[ident]) {
/* array */
case array :
if (lval[1] == ptr[indcnt])
if (k==1) putstk(ptr[type]);
else putmem(ptr+name,ptr[type],
lval[2]);
break;
/* pointer */
case pointer:
if (lval[1] == ptr[indcnt])
if (k==1) putstk(ptr[type]);
else putmem(ptr+name,ptr[type],lval[1]);
else
if (k==1) putstk(cint);
else putmem(ptr+name,cint,0);
break;
/* variable */
case variable :
if (k==1) putstk(ptr[type]);
else putmem(ptr+name,ptr[type],0);
break;
}
}
}
/* */
/* written 4/24/81 By Mike Bernson */
/* */
rvalue(lval,k)
int *lval;
int k;
{
char *ptr;
ptr=lval[0];
if (k==0) return;
switch(ptr[storage]) {
/* local or arg type */
case stkloc :
case stkarg :
switch(ptr[ident]) {
/* ident =array */
case array:
if (lval[1] == ptr[indcnt])
if (k==ADDRESS) indirect(ptr[type]);
else getmem_stack(lval,ptr[type]);
else address(lval,k);
break;
/* ident is an pointer */
case pointer:
if (lval[1] == ptr[indcnt])
if (k==ADDRESS) indirect(ptr[type]);
else getmem_stack(lval,ptr[type]);
else if (k==ADDRESS) indirect(cint);
else getmem_stack(lval,cint);
break;